perm filename FNTFAI.FAI[VIS,HPM]6 blob
sn#295860 filedate 1977-07-13 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00007 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 TITLE FNTFAI
C00003 00003 L3X2: POP P,RETAD L3X2(PIC,YLO,XLO,CHAR)
C00007 00004 L6X4: POP P,RETAD L6X4(PIC,YLO,XLO,CHAR)
C00011 00005 L1X1: POP P,RETAD L1X1(PIC,YLO,XLO,CHAR)
C00015 00006 L3Y4: POP P,RETAD L3Y4(PIC,YLO,XLO,CHAR)
C00019 00007 TITLE FNTVEC
C00023 ENDMK
C⊗;
TITLE FNTFAI
ENTRY L3X2, L3Y4, L6X4, L1X1
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14
T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ PICPNT←5 ↔ BITPNT←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ NFWD←12 ↔ RASW←13 ↔ YEX←14 ↔ PICPT2←CHAR←15
P←17
RETAD: 0
L3X2: POP P,RETAD ; L3X2(PIC,YLO,XLO,CHAR)
POP P,CHAR ;routine to assemble a 3 by 2 compressed character.
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
ASH T,-1
SUB T,PCLN(PIC)
ASH T,1
CAILE T,0
SUB YEX,T
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,3 ;get position of starting bit
IDIVI XHI,3 ;and finishing bit
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT1 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT1: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,2 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE TT,BPTAB(PIC) ;set up skeleton byte pointer
ADD TT,XLO ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ;loop counter for Y, neg count in left *****
HRL YLO,YEX ; <TWICE> line number in right
YLOOP: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-1 ;line address for current Y position
ADDI TT,LINTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL(XLR) ;one
FWL: ILDB TT,PICPNT ;and then do all the others but the last
STL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL
ILDB TT,PICPNT ;the last affected byte
JRST RTL(XHR) ;see how much of it to do
RTL: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP ;check if all lines done
POP P,12
JRST @RETAD
L6X4: POP P,RETAD ; L6X4(PIC,YLO,XLO,CHAR)
POP P,CHAR
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
ASH T,-2
SUB T,PCLN(PIC)
ASH T,2
CAILE T,0
SUB YEX,T
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
IDIVI XLO,6 ;get position of starting bit
IDIVI XHI,6 ;and finishing bit
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
JUMPG XHI,GT3 ;and if exactly one byte,
SUB XHR,XLR ;calculate how many bits in it-1
GT3: ASH XLR,1 ;calculate jump offset for main loop
SUBI XHR,5 ;and for trailing last byte
MOVN XHR,XHR
ASH XHR,1
MOVE TT,BPTAB(PIC) ;set up skeleton byte pointer
ADD TT,XLO ;for X
MOVE PICPT2,(TT)
PUSH P,12
MOVNI YEX,(YEX) ; loop counter for Y, neg count in left
HRL YLO,YEX ; <TWICE> line number in right
YLOOP3: MOVEI TT,(YLO) ;finish up byte pointer by inserting
ASH TT,-2 ;line address for current Y position
ADDI TT,LINTAB(PIC)
MOVE PICPNT,PICPT2
ADD PICPNT,(TT)
LDB TT,PICPNT ;pick up first affected picture byte
JUMPE XHI,RTL3(XHR) ;if only one altogether, skip loop
MOVE NFWD,XHI ;if more than one, do first fractional
JRST STL3(XLR) ;one
FWL3: ILDB TT,PICPNT ;and then do all the others but the last
STL3: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL3
ILDB TT,PICPNT ;the last affected byte
JRST RTL3(XHR) ;see how much of it to do
RTL3: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP3 ;check if all lines done
POP P,12
JRST @RETAD
L1X1: POP P,RETAD ; L1X1(PIC,YLO,XLO,CHAR)
POP P,CHAR ;routine to assemble an uncompressed character.
POP P,XLO
POP P,YLO
POP P,PIC
JUMPL XLO,@RETAD
MOVE RASW,(CHAR)
LSH RASW,-33 ;fetch raster width from font def
MOVEI XHI,-1(RASW) ;use it with XLO to get XHI
ADD XHI,XLO
HRRZ YEX,1(CHAR) ;get DATA ROW COUNT from def
MOVE T,YLO
ADDI T,1(YEX) ;bounds check for Y
SUB T,PCLN(PIC)
CAILE T,0
SUB YEXT
JUMPLE YEX,@RETAD
MOVEI BITPNT,1(CHAR) ;construct byte pointer
TLO BITPNT,100 ;for bit array
CAML XHI,LNBY(PIC)
JRST @RETAD
SUB XHI,XLO ;calculate number of pic bytes-1
GPλht%≠↔-
%)(I¬A)β∧QA∪εR∩$wgKh↓k`Ag-KYKi=\AEsQJAa←%]iKd4∀∪β ⊂∪)(Ya→≡∩∩$wM←d↓0~∀∪5∨-
∪A∪π!(HXQ)($~∀~∀%≠∨-≥$∪300Q30$∩∩wY=←`AG=k]iKHAM←d↓2XA]∃NAG←U]hAS8AYKMP~∀∪⊃I_∪3→<Y30$∩∩wY%]JA]U[EKd↓S\Ae%OQh~(∩∩~∃e→∨∨ Pt∪≠∨Y∩∪)PXQ3→<R∩∩w→S]Sg Ak`A siJAA←S]i∃dAM←HAaSGQkeJ~(∪β $∪)(Y1∪≥)βλQ!∪ε$∩∩wEdAS]g∃eiS]≤AYS]∀ACIIIKgf~(∪≠∨-∀∪!∪πA≥(Y!%π!(d4∀∪β ⊂∪!∪πA≥(XQQ(R~∀4∀∪→ λ∪)(YA∪π!≥P∩∩wa%GVAk@AMSeMhACM→KGiK⊂AaSGQkeJA siJ~(∪'↔∪Aα∪1⊃HY1⊃∩$∩@@@@@@@mC]HA≥↑AS]Q↑AY←=`~∃
]_ht∪%→ ∧∪Q(Y!∪
!≥(∩$wI↑A¬YXAi!JAESQf~∃'Q_ht∪%→ ∧∪PY¬∪)A≥(~∀%∨$∪)PY(~∀% !∧∪Q(Y!∪
!≥(∩$weKiUe\ASP~∀∪'=∃∂
∪a⊃$Y
]_h~∀4∀∪≠∨Y
∪(Y ∪)!≥P∩∩wG!KGVA%LAiS5JAi↑↓gWS`↓¬ ~∀%→'⊂∪PXZfl$∩∩wS8AM←]PAIKM%]SiS=\~∀∪
β≠∂
%(Y%βM.∩∩∩mi↑A]∃qhAY%]J~∀%β≥λ∪ ∪)!≥PY6nn\nnnn\no:~(~∀∪β=¬∃≤∪e→≡Y31∨∨ h$∩wGQ∃GVAS_ACYX↓YS]KLAI←]∀~∀∪∃I'(∪↓I)βλ4∀→_g2Pt∪!∨@∪ Y%∃)βλ∩$∩vA_M2hQ!%εY3→<Y1→≡1π⊃β$$~∀∪!= ∪ Y
⊃β$∩$∩wM←HAgSI∃oCsf↓MkYX↓aCOKL~∀∪!= ∪ Ya→≡~∀%!∨ ∪@Y3→≡4∀∪!∨@∪ Y!%ε~∀∪)+≠!_%1→≡Y↓%)β⊂~∀∪≠=-
∪%¬'.XQ
⊃β$R4∀∪→' ∪%β'\XZff$∩wMKQGPAe¬giKd↓oSIi AMe←4AM←]PAIKL4∀∪≠∨Y∩∪1!∩XZb!%β'.$∩∩wkMJASh↓oSiP↓1→≡AQ↑AOKPA1⊃∩4∀∪β ⊂∪1⊃∩11→≡~(∪⊃%%h∪300bQπ⊃¬$R∩∩mOKhA⊃β)αAI∨.Aπ=+≥(A→e←ZA⊃KL~∀%≠∨-
%(Y3→<~∀∪β⊃ ∩∪(0bQ3`R∩∩w ←k]ILAGQK
VAM←HA2~∀%β'⊂∪PXZd~(∪'+∧%(Y→≥ 2Q!∪R~∀∪¬'⊂∪(0d~∀∪
β∪→
%(X`~(∪'+∧%30YP~∀@@@@@@↓∃+≠!∀∪30αbαJ⊗αH∀ h!→T⎇Q2"($j('∃⊗_T!R i∀DB]qww≤z9:q]⊂1<`4e poinper
TLO BITPNT,100 ;for bit array
∪∪⊃∪-∩∪a→≡Xf$∩∩wO∃hAa←MSiS←8A←LAMiCei%]NAE%h~∀∪% ∪-∩%1⊃∩XL∩∩∩w¬]HAM%]SgQ%]NAE%h~∧@@@@@Aπβ≠0∪1⊃∩1!π→≤!!∪εR4∀∪∃%M(∪↓%∃)βλ~(∪'+∧%1⊃∩Ya→≡∩∩$wGCY
kYCi∀AUk[ KdA←α1βC'~βgS/→5DQ!∀U,ZλpMD ∃D=B"!↔x;Y∧
9H⊂∩↑0qz6≡P7w2H1<z2KεA∧iUa∧l$∀⊗,&)αDD]qXv1z`,ate how many bits in it-D~∃∂(β⊃`⊂L~9MDJ!CλHα".l<;_⎇-L=→(
.αvx⊂≠q39`%t fo↓HASCS8AY←←@~∀∪'U
$&DBI1HHH%oπv!β≠} λ∞NX: ⊗~w3P&_yz⊂1≡z2FEαfgk'αl$ ∩XHR
ASH XHR,1
∪≠=(
⊗$M"Q2I→e$%
∧L~⊃⊃∪@>y=⊂≥x⊂9eYv2z7[⊂1<@4e po@%]`∪↔⊂h(&ε$ &@%EJ∧De
∧L~⊃Q M≥X)⊂M∃%⊃∪j!⊃".yM}H⊗β!!33uHQ4∩0j
K
J
#"APB4∃*9α4ε⊗@εEεB∧fgk∪$DlbV⊗⊂,bV∀DD@; loop counter @→←dA20A]KNαβ∂?Ww!β'9∧¬F.]β"A→∀Sα+→⊂πV,Ql∧DDNβ <TWICE>li`≥J↓]kKE∃dAS\↓`'∨G 4λ$Hh*f2|zAIHLj>@4Y⊃∃%"β
⊗)Ih""'<β4w4\t⊂:xλ1<z2H87tw≥2y⊂!≡P4w9Yy:4w→FE∧`Td∧j*⊗Y∧DB]v4w→P0r2≤2yyP→4πr @
keeK9hA2AA←gSi%←\
∀%β λ∪Q(Y¬!Qβ∧Q!%εR4PJ6 =hQ∃∧L: e"e _5¬#!Q LHA∃∧L8 e"b
JBHh!Q LdH!∃%"J ∀≥∧jA⊂K←
≤6@4≥<λm<\p~λ0s3"Xz2r picture byte¬
JUMPE XHI,RTL2(XHR) ;if only one altogether skip loop
MOVE NFWD,XHI ;if more than one, do firsT fractional
JRST STL2(XLR) ;one
FWL2: SUB PICPNT,LNWD(PIC)
LDB TT,PICPNT ;and then do all the others but the last
STL2: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;check for byte overflow
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
SOJG NFWD,FWL2
SUB PICPNT,LNWD(PIC)
LDB TT,PICPNT ;the last affected byte
JRST RTL2(XHR) ;see how much of it to do
RTL2: ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
ILDB T,BITPNT
ADD TT,T
CAILE TT,BMAX(PIC) ;bounds check
MOVEI TT,BMAX(PIC)
DPB TT,PICPNT ;return it
MOVE T,BITPNT ;check if time to skip BP
LSH T,-36 ;in font definition
CAMGE T,RASW ;to next line
AND BITPNT,[7777777777]
AOBJN YLO,YLOOP2 ;check if all lines done
POP P,12
JRST @RETAD
PRGEND
TITLE FNTVEC
ENTRY V3X2
PCLN←←0
PCWD←←1
PCBY←←2
PCBYA←←3
LNWD←←4
LNBY←←5
LNBYA←←6
WDBY←←7
WDBI←←10
BYBI←←11
BMAX←←12
BPTAB←←13
LINTAB←←14
T←0 ↔ XLO←1 ↔ XLR←2 ↔ XHI←3 ↔ XHR←4 ↔ XD←5 ↔ XDR←XWID←6
TT←7 ↔ PIC←10 ↔ YLO←11 ↔ YD←12 ↔ NFWD←13 ↔ YEX←14 ↔ PICPNT←15
P←17
RETAD: 0
V3X2: POP P,RETAD ; V3X2(PIC,YLO,XLO,XWID,XD,YD)
POP P,YD ;routine to make a vector xd wide, yd long slope xwid
POP P,XD
POP P,XWID
POP P,XLO
POP P,YLO
POP P,PIC
MOVE XHI,XLO
ADD XHI,-1(XWID)
IDIVI XLO,3
IDIVI XHI,3
IDIVI XD,3
YLP: HRRZ TT,YLO
ASH TT,-1
ADDI TT,LINTAB(PIC)
MOVE PICPNT,(TT)
MOVEI TT,-1(XLO)
ADD TT,BPTAB(TT)
ADD PICPNT,(TT)
MOVE NFWD,XHI
SUBI NFWD,1(XLO)
MOVE TT,XHR
JUMPGE NFWD,FRB
SUB TT,XLR
JRST LSB
FRB: ILDB T,PICPNT ;for first fractional byte
ADD T,(XLR)[3
2
1]
CAMLE T,BMAX(PIC)
MOVE T,BMAX(PIC)
DPB T,PICPNT
JUMPE NFWD,LSB
FLP: ILDB T,PICPNT ;for middle full bytes
ADDI T,3
CAMLE T,BMAX(PIC)
MOVE T,BMAX(PIC)
DPB T,PICPNT
SOJG NFWD,FLP
LSB: ILDB T,PICPNT ;for last fractional byte
ADDI T,1(TT)
CAMLE T,BMAX(DD XLO,XD
CAIL XLR,3
DSUB XLO,[-1
3]
DADD XHI,XD
CAIL XHR,3
DSUB XHI,[-1
3]
AOBJN YLO,YLP
END